/*
 * msg_handler.h
 *
 *  Created on: Aug 1, 2013
 *      Author: killerg
 */

#ifndef MSG_HANDLER_H_
#define MSG_HANDLER_H_


template<typename MsgT>
struct msg_traits {
//    typedef typename cs::CMsg MsgT;
//    typedef session_t SessionT;
//
//    typedef void (*HandlerT)(SessionT*, pmsg_t<MsgT>);
//
//    enum {
//        MsgID_ARRAYSIZE = cs::CMsgID_ARRAYSIZE,
//    };
//
//    static bool is_valid_msgid(int id) {
//        return cs::CMsgID_IsValid(id);
//    }
//
//    static void init_handlers(HandlerT handlers[]) {
//        for (int i=0; i<MsgID_ARRAYSIZE; ++i)
//            handlers[i] = handle_default;
//
//        handlers[cs::ID_CEcho] = handle_cecho;
//        handlers[cs::ID_CAuth] = handle_cauth;
//        handlers[cs::ID_CLoad] = handle_cload;
//        handlers[cs::ID_CCreate] = handle_ccreate;
//    }
};


template<typename MsgT>
struct msg_handler_t {
    typedef msg_traits<MsgT> Traits;
    typedef typename Traits::HandlerT HandlerT;
    typedef typename Traits::SessionT SessionT;

    HandlerT handlers[Traits::MsgID_ARRAYSIZE];
    msg_handler_t() {
        Traits::init_handlers(handlers);
    }
    bool handle(SessionT* sess, MsgT* msg) {
        if (!Traits::is_valid_msgid(msg->id()))
            return false;

        auto handler = handlers[msg->id()];
        if (0 == handler)
            return false;

        handler(sess, msg);

        return true;
    }
};

#endif /* MSG_HANDLER_H_ */
